//用C++代码实现一个数据备份功能，主线程会不断生成递增的整数，每生成10个整数会将当前所有
//数据备份到一个文件中,备份操作通过创建子进程完成，父进程会等待备份完成并检查结果
//设计目的 ： 避免备份操作阻塞主程序的数据生成
//            通过子进程隔离备份操作，防止备份失败影响主程序

#include<iostream>
#include<vector>
#include<cstdio>
#include<unistd.h>

#include<sys/types.h>
#include<sys/wait.h>

std::vector<int> data;
const std::string gsep = " ";

enum{
    OK = 0,
    OPEN_FILE_ERROR,
};
int SaveBegin()
{
    std::string name = std::to_string(time(nullptr));
    name += ".backup";
    FILE *fp = fopen(name.c_str(),"w");
    if(fp == nullptr) return OPEN_FILE_ERROR;
    
    std::string datastr;
    for(auto d : data)
    {
        datastr += std::to_string(d);
        datastr += gsep;
    }

    fputs(datastr.c_str(),fp);

    fclose(fp);
    return OK;
}
void Save()
{
    pid_t id = fork();
    if(id == 0)// 子进程
    {
        int code = SaveBegin();
        exit(code);
    }
    int status = 0;
    pid_t rid = waitpid(id,&status,0);
    if(rid > 0)
    {
        int code = WEXITSTATUS(status);
        if(code == 0) printf("backup success,exit code:%d\n",code);
        else printf("backup fail,exit code:%d\n",code);
    }
    else{
        perror("waitpid");
    }
}

int main()
{
    int cnt = 1;
    while(true)
    {
        data.push_back(cnt++);
        sleep(1);
        if(cnt % 10 == 0)
        {
            Save();
        }
    }

    return 0;
}
